package interviewQuestions;

// 实现循环队列，实现 add，poll，是否空，是否满的方法。
public class CircularQueue {
    public int size = 0;
    public int capacity = 5;// 默认的容量为5
    public int[] data;
    public int head=0; // 头指针
    public int tail=0; // 尾指针

    // 构造方法
    public CircularQueue(){
        this.data = new int[this.capacity];
    }

    // 自定义容量大小
    public CircularQueue(int capacity){
        this.capacity = capacity;
        this.data = new int[this.capacity];
    }

    // 添加
    public void add(int value){
        // 判断是否满了 满了就抛异常
        if(isFull()){
            throw new RuntimeException("The queue was FULL");
        }
        // 如果没有满将数据添加到队列并且尾指针++
        data[tail] = value;
        tail++;
        tail = tail % capacity; // 防止尾指针假溢出
        size++; // 当前数组的大小+1
    }

    // poll
    public int poll(){
        // 如果为空  抛出一个空队列异常
        if(isEmpty()){
            throw new RuntimeException("The queue is EMPTY");
        }else{// 如果不为空的话 将第一个元素返回 并且head+1
            return data[head++];
        }
    }

    public boolean isEmpty(){
        if(data.length == 0){
            return true;
        }else{
            return false;
        }
    }

    // 判断是否满
    public boolean isFull(){
        if(head == tail && head != 0){ // 如果头指针和尾指针相等代表满了 且不等于0
            return true;
        }
        return false;
    }

    // main方法
    public static void main(String[] args) {
        CircularQueue cq = new CircularQueue();
        cq.add(22);
        cq.add(21);
        cq.add(13);
        cq.add(2);
        cq.add(51);
        System.out.println(cq.poll());
        cq.add(15);
    }

}
